#ifndef __BSP_FLASH_H
#define __BSP_FLASH_H

#include "flash.h"

// 在falsh中,每个扇区为 0x200(512)

#define  Sector127_BaseAddr (0x0000fe00)  
#define  Sector126_BaseAddr (0x0000fc00)  
#define  Sector125_BaseAddr (0x0000fa00) 
#define  Sector124_BaseAddr (0x0000f800)  
#define  Sector123_BaseAddr (0x0000f600) 

/*这里离只有底层宏定义,不涉及APP层*/

/* RAM相关宏定义 */
#define SRAM_BASE                   ((uint32_t)0x20000000)            //RAM基地址
#define RAM_SIZE                    0x2000ul                          //RAM尺寸8kb

/* flash相关宏定义 */
#define  FLASH_BASE  				(0x0)
#define  FLASH_SECTOR_SIZE			(512ul)

/**
 *****************************************************************************
 ** \brief 从确保初始化正确执行后方能进行FLASH编程操作
 ** 
 **
 ** \param 1 : u8FreqCfg  FLASH编程时钟频率配置(根据HCLK的频率选择配置值)：
 **                               1      - 4MHz;
 **                               2      - 8MHz;
 **                               4      - 16MHz;
 **                               6      - 24MHz;
 **                               8      - 32MHz;
 **                               12     - 48MHz;
 ** \retval   void                                  
 *****************************************************************************/
void BSP_Flash_Init(uint8_t FreqCfg);


/**
 *****************************************************************************
 ** \brief 从FLASH地址读一个字节
 **
 **
 ** \param 1 : Addr 地址
 ** 
 ** \retval   void                                  
 *****************************************************************************/
uint8_t BSP_Flash_ReadByte(uint32_t Addr);

/**
 *****************************************************************************
 ** \brief 从FLASH地址读一个节
 **
 **
 ** \param 1 : Addr 地址
 ** 
 ** \retval   void                                  
 *****************************************************************************/

uint32_t BSP_Flash_ReadWord(uint32_t Addr);


/**
 *************************************************************************
 ** \brief 从FLASH 某个扇区遍历查询空的地址
 **
 **
 ** \param 1 : Addr 地址  2：addr_jump累加间隔
 ** 
 ** \retval   查询的地址                                  
 **************************************************************************/

uint32_t BSP_Flash_Sector_Seek(uint32_t Addr,uint8_t addr_jump);


/**
 ***********************************************************************
 ** \brief 按字节读取一片flash,长度为Size个字节
 **
 **
 ** \param 1 : Addr 地址  2： *ReadBuff 接收数据指针  3： 数据长度
 ** 
 ** \retval   void                                  
 ***********************************************************************/
void BSP_Flash_ReadBytes(uint32_t Addr, uint8_t *ReadBuff, uint32_t ByteLength);


/**
 ***********************************************************************
 ** \brief  flash一个扇区读检查空
 **
 **
 ** \param 1 : addr 地址  
 ** 
 ** \retval   void                                  
 ***********************************************************************/
boolean_t BSP_Flash_CheckBlank(uint32_t addr);

void BSP_Flash_Sector_Clear(uint32_t sector_addr);

void BSP_Flash_WriteHalfWord(uint32_t addr, uint16_t data);

void BSP_Flash_WriteWord(uint32_t addr,uint32_t data);

en_result_t BSP_Flash_Write_Sector(uint32_t startaddr,uint8_t *buf);

/**
 ***********************************************************************
 ** \brief  FLASH写操作
 **
 **
** \param 1 :WriteAddr 写地址   2 :*pBuffer 数据写指针   3 :NumToWrite 数据个数
 ** 
 ** \retval   void                                  
 ***********************************************************************/
void BSP_Flash_WriteBytes(uint32_t WriteAddr, uint8_t *pBuffer, uint16_t NumToWrite)	;


#endif

